<?php
/**
* 共用函数
*
* 本程序主要作用定义系统共用的函数
* 
* @category   Common
* @copyright  Copyright (c) ink工作室 (http://www.inkphp.com)
* @author     张旭刚
* @version    v1.0 beta
*/

/**
 * 检查过滤字符串的函数，进行防注入处理
 * @param type $data 要过滤的参数可以使数组或字符串
 * @return type 数组或字符串
 */
function checkStr($data){
    if(is_array($data)){
        foreach($data as $k => $v){
            if($k == 'submit'){
                unset($data[$k]);
            }else{
                $data[$k] = check($v);
            }
        }
        return $data;
    }
    return check($data);
}
/**
 * 处理字符串，防注入处理
 * @param type $text 要过滤的字符串
 * @return type 过滤之后的字符串
 */
function check($text){
    //处理Sql注入问题
    $text = str_replace(';','',$text);
    $text = str_replace(',','',$text);
    $text = str_replace('#','',$text);
    
    //处理HTML脚本注入问题
    $text = str_replace('<', '&lt;', $text);
    $text = str_replace('>', '&gt;', $text);
    return $text;
}

/**
 * 取得POST提交的数据，如果不传入参数则返回$_POST数组
 * @param type $name 提交表单的名称
 * @return type 提交表单的值
 */
function P($name = null){
    checkReferer();
    if(!empty($name)){
        return checkStr($_POST[$name]);
    }else{
        return checkStr($_POST);
    }
}

/**
 * 不允许远程提交POST数据 GET提交的防远程提交请用户自己斟酌，请注意您不能屏蔽所有的外部GET提交，否则搜索引擎将无法找到您的页面。
 */
function checkReferer(){
    if(!empty($_POST)){
        $thisDomain = $_SERVER['SERVER_NAME'];
        $referer= str_replace('http://','',$_SERVER['HTTP_REFERER']);
        $arr = explode('/', $referer);
        $refererDomail = $arr[0];
        if($thisDomain != $refererDomail){
            die(L('you_can_not_remotely_want_the_site_to_submit_data'));
        }
    }
}

/**
 * 取得GET提交的数据，如果不传入参数则返回$_GET数组
 * @param type $name 提交参数的名称
 * @return type 提交参数的值
 */
function G($name = null){
    if(!empty($name)){
        return checkStr($_GET[$name]);
    }else{
        return checkStr($_GET);
    }
}

/**
 * 取得REQUEST提交的数据，如果不传入参数则返回$_REQUEST数组
 * @param type $name 提交参数的名称
 * @return type 提交参数的值
 */
function R($name = null){
    if(!empty($name)){
        return checkStr($_GET[$name]);
    }else{
        return checkStr($_GET);
    }
}

/**
 * 取得模板文件的路径，用在模板文件中包含其他模板文件的时候
 * @param type $name 模板名称
 * @return string 返回全路径
 */
function getTplPath($name){
    $path = './Theme/'.__DEFAULT_THEME__.'/'.APP_NAME.'/'.$name.'.tpl.php';
    return $path;
}

/**
 * 用来处理跳转路径
 * @param type $router 链接地址
 * @param type $data 要传递的参数
 * @return string 完整链接地址
 */
function U($router,$data = null){
    if(__USE_ROUTER__){
        $router = '/'.$router;
        if(!empty($data)){
            foreach($data as $k => $v){
                $str .= '/'.$k.'/'.$v;
            }
        }
        $router .=$str;
    }else{
        $d = explode('/',$router);
        $router = './index.php?app='.$d[0].'&m='.$d[1].'&a='.$d[2];
        foreach((array)$data as $k => $v){
            $str .= '&'.$k.'='.$v;
        }
        $router .=$str;
    }
    return $router;
}

/**
 * 用来导入CSS和JS文件，可以采用两种方式，一种是以文件形式导入，一种是以代码形式导入，具体参考配置文件中的常量__CACHE_FORWARD_FILE__
 * @param type $name 导入文件的名字
 * @param type $type 导入文件的扩展名
 */
function S($name = 'base',$type = 'css'){
    $pNames = array(
        'sys_msg',
        'sys_jquery',
        'sys_swfupload',
        'sys_openWin',
        'sys_upload',
        'sys_swfupload.queue',
        'sys_fileprogress',
        'sys_handlers',
        'sys_str',
        'sys_page',
        'sys_verfyCode'
        );
    if(in_array($name, $pNames)){
        $path = '/core/static/Public/'.$type.'/'.$name.'.'.$type;
    }else{
        $path .= '/static/'.__DEFAULT_THEME__.'/'.strtolower(APP_NAME).'/'.$type.'/'.$name.'.'.$type;
    }
    if(file_exists('.'.$path)){
        if(!__CACHE_FORWARD_FILE__){
            $str = '?'.rand(1000000,9999999);
            $path .= $str;
        }
        if(!__LOAD_FILE__){
            $path = '.'.$path;
            if($type == 'css'){
                $code = '<style type="text/css">'."\n";
                $code .= file_get_contents($path);
                $code .= '</style>'."\n";
                echo $code;
            }elseif($type == 'js'){
                $code = '<script language="javascript">'."\n";
                $code .= file_get_contents($path);
                $code .= '</script>'."\n";
                echo $code;
            }
        }else{
            $path = '.'.$path;
            if($type == 'css'){
                echo '<link rel="stylesheet" href="'.$path.'" type="text/css" />'."\n";
            }elseif($type == 'js'){
                echo '<script language="javascript" src="'.$path.'"></script>'."\n";
            }
        }
    }
}

/**
 * 国际化方法，用来寻找各种语言包，并将之翻译显示在页面上
 * @param type $name 要翻译的字符串
 * @return type 
 */
function L($name){
    $path = './core/Lang/'.__DEFAULT_LANG__.'/language.php';
    if(!file_exists($path)){
        return getLang($name);
    }else{
        $lang = include($path);
        if(!empty($lang[$name])){
            return $lang[$name];
        }else{
            return getLang($name);
        }
    }
}
/**
 * 用来寻找用户自定义的国际化文件
 * @param type $name 要翻译的字符串
 * @return type 翻译之后的字符串，如果没有找到返回原字符串
 */
function getLang($name){
    $path = './Lang/'.__DEFAULT_LANG__.'/'.APP_NAME.'/language.php';
    if(!file_exists($path)){
        return $name;
    }else{
        $lang = include($path);
        if(!empty($lang[$name])){
            return $lang[$name];
        }else{
            return $name;
        }
    }
}

/*
 * 
 */
/**
 * 系统主函数用来按照系统指定的app，m,a去找到指定的组中的指定的控制器中的指定Action来运行
 * @param type $app 应用名称
 * @param type $m Controller名称
 * @param type $a Acton名称
 * @param type $data 其他参数
 */
function run($app = 'Home', $m = 'Index', $a = 'index', $data){
    $controller = $m.'Controller';
    if($app == ''){
        $path = __BASE__.'/'.$controller.'.class.php';
    }else{
        $path = './Apps/'.$app.'/Controller/'.$controller.'.class.php';
    }
    if(!file_exists($path)){
        $error = 'module_is_not_exists:'.$controller;
    }else{
        include_once($path);
        if(!class_exists($controller)){
            $error = 'module_is_not_exists:'.$controller;
        }else{
            $x = new $controller($data);
            if(empty($x->tplVars)){
                $x->$a();
            }
        }
    }
    
    if(!empty($error)){
        $x = new Controller($data);
        $x->error($error);
    }
}

/**
 * 自动生成初始App的方法
 */
function checkApp(){
    $apps_path = './Apps';
    if(!file_exists($apps_path)){
        @mkdir($apps_path);
    }
    
    $app_path = $apps_path.'/'.APP_NAME;
    if(!file_exists($app_path)){
        @mkdir($app_path);
    }
    
    $action_path = $app_path.'/Controller';
    if(!file_exists($action_path)){
        @mkdir($action_path);
    }
    
    $default_Action = $action_path.'/IndexController.class.php';
    if(!file_exists($default_Action)){
        $source_path = './core/Lib/auto/auto.php';
        copy($source_path,$default_Action);
    }
}
/**
 * 自动生成初始模板的方法
 */
function checkTheme(){
    $themes_path = './Theme';
    if(!file_exists($themes_path)){
        @mkdir($themes_path);
    }
    
    $theme_path = $themes_path.'/'.__DEFAULT_THEME__;
    if(!file_exists($theme_path)){
        @mkdir($theme_path);
    }
    
    $app_theme = $theme_path.'/'.APP_NAME;
    if(!file_exists($app_theme)){
        @mkdir($app_theme);
    }
    
    $model_theme = $app_theme.'/'.MODEL_NAME;
    if(!file_exists($model_theme)){
        @mkdir($model_theme);
    }
    
    $tpl_theme = $model_theme.'/index.tpl.php';
    if(!file_exists($tpl_theme)){
        $source_path = './core/Lib/auto/auto.tpl.php';
        copy($source_path,$tpl_theme);
    }
}

/**
 * 自动生成上传文件以及其他系统生成文件存储位置的方法 
 */
function checkData(){
    $data_path = './Data';
    if(!file_exists($data_path)){
        @mkdir($data_path);
    }
}

/**
 * 自动生成静态文件如：css，js的方法 
 */
function checkStatic(){
    $static_path = './static';
    if(!file_exists($static_path)){
        @mkdir($static_path);
    }
    
    $theme_static_path = $static_path.'/'.__DEFAULT_THEME__;
    if(!file_exists($theme_static_path)){
        @mkdir($theme_static_path);
    }
    
    $app_static_path = $theme_static_path.'/'.APP_NAME;
    if(!file_exists($app_static_path)){
        @mkdir($app_static_path);
    }
    
    $css_path = $app_static_path.'/css';
    if(!file_exists($css_path)){
        @mkdir($css_path);
    }
    
    $css_theme = $css_path.'/index.css';
    if(!file_exists($css_theme)){
        $source_path = './core/Lib/auto/auto.css';
        copy($source_path,$css_theme);
    }
    
    $css_images_path = $theme_static_path.'/css/images';
    if(!file_exists($css_images_path)){
        @mkdir($css_images_path);
    }
    
    $image_path = $theme_static_path.'/images';
    if(!file_exists($image_path)){
        @mkdir($image_path);
    }
    
    $js_path = $theme_static_path.'/js';
    if(!file_exists($js_path)){
        @mkdir($js_path);
    }
}

function checkLang(){
    $lang_path ='./Lang';
    if(!file_exists($lang_path)){
        @mkdir($lang_path);
    }
    
    $default_path = $lang_path.'/'.__DEFAULT_LANG__;
    if(!file_exists($default_path)){
        @mkdir($default_path);
    }
    
    $app_path = $default_path.'/'.APP_NAME;
    if(!file_exists($app_path)){
        @mkdir($app_path);
    }
    
    $language_path = $app_path.'/language.php';
    if(!file_exists($language_path)){
        @file_put_contents($language_path, '<?php'."\n".'return array();'."\n".'?>');
    }
}

function checkModel(){
    $model_path ='./Model';
    if(!file_exists($model_path)){
        @mkdir($model_path);
    }
}/**
 * 自动生成以上要生成的所有东西 
 */
function checkDir(){
    if(!checkLock()){
        checkTheme();
        checkApp();
        checkData();
        checkStatic();
    }
}

function checkLock(){
    $path = './core/Common/install.lock';
    if(file_exists($path)){
        return true;
    }else{
        return false;
    }
}

function createLock(){
    $path = './core/Common/install.lock';
    $content = '1';
    file_put_contents($path, $content);
}/**
 * 自动加载Controller的方法
 * @param type $name Controller的名字
 */
function __autoload($name){
    include('./Apps/'.APP_NAME.'/Controller/'.$name.'.class.php');
}